// 引入vnode，编写低配版h函数，这个函数只能接受三个参数
import vnode from './vnode.js'
// 第一个参数必须是节点名称，第二个是数据，第三个是文字、数组或者单个的h函数
export default function (sel, data, c) {
    // 判断第三个参数类型
    // 基本数据类型
    if (typeof c === 'string' | typeof c === 'number') {
        return vnode(sel, data, undefined, c, undefined)
        // 数组
    } else if (Array.isArray(c)) {
        // 用于收集子节点
        let children = []
        // 遍历数组中的h函数
        for (let i = 0, length = c.length; i < length; i++) {
            // 判断数组中的值是否是合法的h函数
            if (!(typeof c[i] === 'object' && c[i].hasOwnProperty('sel'))) {
                throw new Error('第三个参数传入的数组中有的项不是h函数')
            }
            // 因为数组中都是h函数，而且在c[i]时就已经执行了，而且h函数就是会返回vnod对象
            // 所以不需要手动执行c[i]()
            // 收集子节点
            children.push(c[i])
        }
        return vnode(sel, data, children, undefined, undefined)
        // 判断第三个参数是h函数的情况
    } else if (typeof c === 'object' && c.hasOwnProperty('sel')) {
        let children = [c]
        return vnode(sel, data, children, undefined, undefined)
    } else {
        throw new Error('参数传入错误')
    }
}